]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
altTab: Check for reentrancy in override function of _onItemMotion()
authorJonas Dreßler <verdre@v0yd.nl>
Wed, 25 Apr 2018 19:34:00 +0000 (21:34 +0200)
committerMarge Bot <marge-bot@gnome.org>
Tue, 25 Jan 2022 20:03:01 +0000 (20:03 +0000)
Just like in the parent _onItemMotion() function, we should check for
reentrancy in our override.

Because the hover timeout will prevent a new selection from happening
for some time, in addition to checking for this._highlighted reentrancy,
we also need to track the item that's being hovered during the timeout.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2098>

js/ui/altTab.js

index c03c680c3366f68979e6793325e8880a022b4309..e7886e4f1ecd8466bc1db03936786e413954bafa 100644 (file)
@@ -707,6 +707,7 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
         }
 
         this._altTabPopup = altTabPopup;
+        this._delayedHighlighted = -1;
         this._mouseTimeOutId = 0;
 
         this.connect('destroy', this._onDestroy.bind(this));
@@ -792,16 +793,26 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
     // We override SwitcherList's _onItemMotion method to delay
     // activation when the thumbnail list is open
     _onItemMotion(item) {
+        if (item === this._items[this._highlighted] ||
+            item === this._items[this._delayedHighlighted])
+            return Clutter.EVENT_PROPAGATE;
+
         const index = this._items.indexOf(item);
 
-        if (this._mouseTimeOutId != 0)
+        if (this._mouseTimeOutId !== 0) {
             GLib.source_remove(this._mouseTimeOutId);
+            this._delayedHighlighted = -1;
+            this._mouseTimeOutId = 0;
+        }
+
         if (this._altTabPopup.thumbnailsVisible) {
+            this._delayedHighlighted = index;
             this._mouseTimeOutId = GLib.timeout_add(
                 GLib.PRIORITY_DEFAULT,
                 APP_ICON_HOVER_TIMEOUT,
                 () => {
                     this._enterItem(index);
+                    this._delayedHighlighted = -1;
                     this._mouseTimeOutId = 0;
                     return GLib.SOURCE_REMOVE;
                 });